Accidentes en Madrid: cómo y dónde

Authors

Gema Fernández-Avilés (Gema.FAviles@uclm.es)

Isidro Hidalgo (Isidro.Hidalgo@uclm.es)

Published

Invalid Date

Note

Los datos que se utilizan en esta historia están disponibles en el paquete CDR que puede instalarse con el siguiente comando:

install.packages("remotes")
remotes::install_github("cdr-book/CDR")

Accidentes de tráfico en la Ciudad de Madrid registrados por Policía Municipal con víctimas y/o daños al patrimonio en el 2020. Los datos se han descargado del Portal de datos abiertos del Ayuntamiento de Madrid.)

1 Importancia del contexto.

Exercise 1 ¿Dónde se han producido los accidentes de tráfico en Madrid en el 2020?

Code
library("CDR")
library("tidyverse")
ggplot(data = accidentes2020_data,
       aes(x = coordenada_x_utm, y = coordenada_y_utm)) + 
  geom_point() +
  coord_fixed()

No tenemos información, solo unos datos represenados en un gráfico.

2 Elección de un gráfico efectivo

Code
library("sf")
accidentes2020_sf <- st_as_sf(accidentes2020_data,
  coords = c("coordenada_x_utm", "coordenada_y_utm"),
  crs = 25830 # proyección ETRS89/ UTM zone 30N. Área de uso: Europa  
  )  

library("mapSpain")
madrid <- esp_get_munic(munic = "^Madrid$") |>
  st_transform(25830) 

# descara imagen de un de mapa estático de las carreteas de Madrid
tile <- esp_getTiles(madrid, "IDErioja", zoommin = 2)  

ggplot() +
  tidyterra::geom_spatraster_rgb(data = tile) +
  geom_sf(data = accidentes2020_sf, 
    col = "blue", size = 0.1, alpha = 0.3) +
  coord_sf(expand = FALSE)

3 El desorden es tu enemigo.

Exercise 2 ¿Cuándo se han producido los accidentes?

Code
ggplot(data = accidentes2020_data,
       aes(x = fecha, y = hora)) + 
  geom_point() +
  theme_minimal()

4 agrupar por hora y día de la semana para ver si hay un patrón ??

Code
library(data.table)
# Convertir la columna 'fecha' a formato Date
accidentes2020_data[, fecha := as.Date(fecha, format = "%d/%m/%Y")]

Exercise 3 ¿De qué tipo son?

Code
accidentes2020_data <- accidentes2020_data |>
  mutate_if(is.character, as.factor)

accidentes2020_data |>
  count(tipo_accidente) |>
  mutate(porcentaje = 100 * n / sum(n))
                  tipo_accidente     n porcentaje
                          <fctr> <int>      <num>
 1:                      Alcance  7294 22.4936010
 2:           Atropello a animal    75  0.2312887
 3:          Atropello a persona  2127  6.5593487
 4:                        Caída  2118  6.5315940
 5: Choque contra obstáculo fijo  4667 14.3923274
 6:             Colisión frontal   899  2.7723810
 7:      Colisión fronto-lateral  8081 24.9205909
 8:             Colisión lateral  4386 13.5257656
 9:            Colisión múltiple  2231  6.8800691
10:                Despeñamiento     2  0.0061677
11:                         Otro   251  0.7740463
12:        Solo salida de la vía   151  0.4656613
13:                       Vuelco   145  0.4471582
Code
accidentes2020_data |>
  ggplot() +
  geom_bar(aes(y=tipo_accidente), fill = "pink")+
  theme_bw()

Exercise 4 ¿Existe asociación entre el sexo y el tipo de persona (conductor, pasajero, peaton) que sufre el accidente?

Code
library("gplots")
library(RColorBrewer)

# accidentes2020_data_sin_na <- accidentes2020_data |>
#  na.omit()
  
balloonplot(table(accidentes2020_data$sexo , accidentes2020_data$tipo_persona))

Exercise 5 ¿Existe asociación entre el sexo y el tipo de accidente?

Code
library("ggmosaic")
accidentes2020_data |>
ggplot() +
  geom_mosaic(aes(x = product(tipo_accidente, sexo), 
                  fill=sexo)) 

Code
niveles <- levels(factor(accidentes2020_data$tipo_accidente))
etiquetas <- set_names(str_wrap(niveles, width = 20), 
                       niveles)
accidentes2020_data  |>
  ggplot(aes(sexo, fill = estado_meteorológico)) +
  facet_wrap(vars(tipo_accidente), 
             labeller = as_labeller(etiquetas)) +
  geom_bar() +
  labs(fill = "Estado Meteorológico") +
  theme(axis.text.x  = element_text(angle = 90)) +
  theme_minimal()

5 Centra la atención de tu audiencia.

Code
# con la librería leflet podemos crear un mapa interactivo
library("leaflet")
library("sf")

utm_crs <- "+proj=utm +zone=30 +datum=WGS84 +units=m +no_defs"
accidentes_sf <- st_as_sf(accidentes2020_data, 
                          coords = c("coordenada_x_utm", "coordenada_y_utm"), crs = utm_crs)
accidentes_sf <- st_transform(accidentes_sf, crs = 4326)
accidentes2020_data$longitude <- st_coordinates(accidentes_sf)[, 1]
accidentes2020_data$latitude <- st_coordinates(accidentes_sf)[, 2]


leaflet(data = accidentes2020_data) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitude, lat = ~latitude, 
                   radius = 2, color = "red", opacity = 0.5) %>%
  addProviderTiles(providers$Esri.WorldImagery)
Code
library("leaflet")
library("sf")

accidentes2020_sf <- st_transform(accidentes2020_sf, crs = 4326)
accidentes2020_data$longitude <- st_coordinates(accidentes2020_sf)[, 1]
accidentes2020_data$latitude <- st_coordinates(accidentes2020_sf)[, 2]


leaflet(data = accidentes2020_data) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitude, lat = ~latitude, 
                   radius = 1, color = "red", opacity = 0.5)  
Code
#  addProviderTiles(providers$Esri.WorldImagery)

6 Piensa como un diseñador.

Code
leaflet(data = accidentes2020_data) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitude, lat = ~latitude, 
                   radius = 2, color = "red", opacity = 0.5, clusterOptions = markerClusterOptions())
Code
# ahora haz un mapa de calor

library("leaflet.extras")
leaflet(data = accidentes2020_data) %>%
  addTiles() %>%
  addHeatmap(lng = ~longitude, lat = ~latitude, blur = 20, max = 0.05)

Exercise 6 ¿Dónde se registraron los accidentes el día de la declaración del Estado de Alarma en Madrid?

Code
library(data.table)

# Convertir la columna 'fecha' a formato Date
accidentes2020_data[, fecha := as.Date(fecha, format = "%d/%m/%Y")]

# Definir el rango de fechas del estado de alarma
fecha_inicio <- as.Date("2020-03-14")
fecha_fin <- as.Date("2020-03-14")

# Filtrar el dataset por el rango de fechas
estado_alarma_data <- accidentes2020_data[fecha >= fecha_inicio & fecha <= fecha_fin]

# Crear un mapa con los accidentes
leaflet(data = estado_alarma_data) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitude, lat = ~latitude, 
                   radius = 3, color = "red", opacity = 0.5)  

7 Cuenta la historia de tus datos. El arco narrativo.